题目链接
【Codeforces 533A】Berland Miners
做法
先判定不修改是否合法。对于一个点 $ i $ ,它的价值为它到根节点 $ 1 $ 的路径上的最小值 $ mn[i] $(存在修改可能为次小值 $ nxt[i] $ ),将所有人的高度和 $ mn[i] $ 排序,山洞权值为 $ 1 $ ,人的权值为 $ -1 $ ,若任意前缀和都不小于 $ 0 $ ,则无需修改。
如果存在修改,那么一定要使得最后一个前缀和小于 $ 0 $ 的位置不小于 $ 0 $ ,这样处理就不需要二分了。
记录有多少个节点是取了 $ i $ 节点的 $ h_i $ , $ i $ 节点的修改会影响到这些节点的值。用线段树维护前缀和(需要实现离散化权值)即可。
1 |
|